package xyz.erupt.flow.bean.entity.form;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author PP
 * @version 1.0
 * @project Erupt
 * @description 自定义value类型处理
 * @date 2024/9/20 09:21:58
 */
public class CustomValueDeserializer extends JsonDeserializer<Object> {

    @Override
    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);

        // 如果是数组
        if (node.isArray()) {
            List<Object> list = new ArrayList<>();
            Iterator<JsonNode> elements = node.elements();
            while (elements.hasNext()) {
                JsonNode element = elements.next();
                // 判断每个元素的类型，处理不同类型的元素
                if (element.isTextual()) {
                    list.add(element.asText());
                } else if (element.isNumber()) {
                    list.add(element.asInt());  // 或者 asDouble() 视情况而定
                } else if (element.isObject()) {
                    list.add(element.toString());  // 将对象转成字符串保存，或更复杂的处理
                }
            }
            return list;
        }

        // 如果是字符串
        if (node.isTextual()) {
            return node.asText();
        }

        // 如果是对象
        if (node.isObject()) {
            return node.toString();  // 将对象转换为 JSON 字符串，或者可以进一步反序列化为 Map 等结构
        }

        // 如果是数字
        if (node.isNumber()) {
            return node.numberValue();  // 返回数字
        }

        // 其他类型的处理，或者默认返回 null
        return null;
    }
}
